package vip.xiaonuo.smzq.modular.lifecycle.service.module;


import cn.hutool.core.lang.tree.TreeNode;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import vip.xiaonuo.smzq.modular.lifecycle.entity.KclCb08Xzqh;
import vip.xiaonuo.smzq.modular.lifecycle.entity.KclKs;
import vip.xiaonuo.smzq.modular.lifecycle.entity.LifeCycleMineStore;
import vip.xiaonuo.smzq.modular.lifecycle.entity.LifeCyclePedigee;
import vip.xiaonuo.smzq.modular.lifecycle.po.QueryAdministractiveRegionPO;
import vip.xiaonuo.smzq.modular.lifecycle.po.QueryMineInfoPO;
import vip.xiaonuo.smzq.modular.lifecycle.po.QueryMineStorePO;
import vip.xiaonuo.smzq.modular.lifecycle.po.QueryYearStorePO;
import vip.xiaonuo.smzq.modular.lifecycle.po.datamanager.QueryMineListPO;
import vip.xiaonuo.smzq.modular.lifecycle.vo.*;

import java.util.List;
import java.util.Map;

/**
 * <ul>
 * <li>name:  LifeCycleService</li>
 * <li>author name: GEOSCENE_YUYANFEI</li>
 * <li>create time: 2024-03-20 15:39:43</li>
 * </ul>
 */
public interface LifeCycleService {
    /**
     * 查询矿山信息
     * @param queryMineInfoPO
     * @return
     */
    List<QueryMineInfoRetVO> queryMineInfo(QueryMineInfoPO queryMineInfoPO);

    /**
     * 查询矿山全生命周期列表数据
     * @param queryMineStorePO 生命周期实体bean
     * @param isQueryKQAll 是否查询矿区所有的
     * @return 生命周期列表数据
     */
    List<QueryMineStoreVO> queryLifeCycleMineList(QueryMineStorePO queryMineStorePO,boolean isQueryKQAll);

    /**
     * 查询矿山全生命周期列表数据
     * @param queryMineStorePO 生命周期实体bean
     * @return 生命周期列表数据
     */
    List<QueryMineStoreVO> queryLifeCycleMineListRS(QueryMineStorePO queryMineStorePO);

    /**
     * 统计年度储量vo
     * @return queryYearStorePO 年储量参数类
     */
    List<QuerYearStoreVO> staticsYearStore(QueryYearStorePO queryYearStorePO);

    /**
     * 根据矿山id查询该矿山所有的矿石类型字典
     * @param mineId 矿山id
     * @return 该矿山所有的矿石类型字典
     */
    List<MineTypeVO> queryLifeCycleMineralTypeDict(QueryMineStorePO queryMineStorePO);


    Page<MineVO> queryMineList(KclKs kclKs);

    long queryMineCount(KclKs kclKs);

    /**
     * 实时转换成84坐标的查询矿山列表
     * @param kclKs
     * @return
     */
    List<MineVO> queryMineListTran(KclKs kclKs);
//    List<QueryMineInfoVO>
    Page<QueryMineInfoVO> queryMineListPage(QueryMineListPO queryMineListPO);

    /**
     * 资源目录树查询,并可以模糊匹配
     * @param  kclCb08Xzqh 查询行政区的bean
     * @return
     */
    RegionMineTreeVO queryMineRegionTree(QueryAdministractiveRegionPO queryAdministractiveRegionPO);

    /**
     * 得到行政区树节点
     * @param regionList 行政区类列表
     * @return
     */
    List<TreeNode<Integer>> getRegionNodes(List<KclCb08Xzqh> regionList);

    /**
     * 查询矿山信息列表
     * @param queryMineInfoPO 参数类
     * @param isMapInit 是否是地图初始化
     * @return
     */
    List<QueryMineInfoVO> queryMineInfoList(QueryMineInfoPO queryMineInfoPO,boolean isQuerySW);

    /**
     * 得到查询生命周期补充sql
     * @param msTableAs 生命周期节点表别名
     * @param mineralCode 矿区码
     * @return
     */
    String getQueryLifeCycleApplySQL(String msTableAs, Integer mineralCode);

    /**
     * 得到登记编号后两位
     * @param regClassCode 登记分类编号
     * @return
     */
    String getRegClassCodeSuffixTwo(Integer regClassCode);

    /**
     * 得到矿山矿业权类型，以2开头的为采矿权 以 1开头的xkzh不为空的则为探矿权  如果是3和4 则则同一个矿区的 看1的
     * @param queryMineInfoVOS
     * @return
     */
    List<QueryMineInfoVO> getKsExportType(List<QueryMineInfoVO> queryMineInfoVOS);

    /**
     * 得到模糊匹配的sql
     * @param msTableAs 表的别名
     * @param regClassCode 登记分类代码
     * @param keyword 模糊匹配的关键字
     * @param direction left right center
     * @return
     */
    String getQueryLifeCycleApplyLikeSQL(String msTableAs, Integer regClassCode,String keyword,String direction);

    /**
     * 查询全生命周期节点列表
     * @param queryMineStorePO
     * @return
     */
    List<QueryMineStoreVO> queryLCNodeList(QueryMineStorePO queryMineStorePO,boolean isQueryCoor);

    /**
     * 初始化矿山坐标
     * @param queryMineInfoVOS
     * @param isQuerySW 是否需要查询三维
     */
    void initMineCool(List<QueryMineInfoVO> queryMineInfoVOS,boolean isQuerySW);

    /**
     * 处理合并的数据
     * @param queryMineStoreVOS 生命周期节点列表
     * @return 处理完的数据
     */
    List<QueryMineStoreVO> handerMerge(List<QueryMineStoreVO> queryMineStoreVOS);

    /**
     * 得到登记分类编号后三位sql
     * @param ksAlias 矿山表别名
     * @return
     */
    String getKsDjflbhLastThreeLSQL(String ksAlias);

    /**
     * 初始化第一个族谱
     * @param allQms 所有的生命周期节点
     */
    void initFirstPedigee(List<QueryMineStoreVO> allQms);

    /**
     * 查询其他矿山的生命周期节点id
     * @param curAllPedMap 所有族谱map
     * @param megerPedIdsList 合并族谱id列表
     * @return
     */
    List<QueryMineStoreVO> queryOtherMineLcNode(Map<String, LifeCyclePedigee> curAllPedMap, List<List<String>> megerPedIdsList);

    /**
     * 得到查询生命周期基础wrapper
     * @param queryMineStorePO
     * @param isMustMineralCode 是否必须矿区编号
     * @param isConMine 是否关联矿山
     * @return
     */
    MPJLambdaWrapper<LifeCycleMineStore> getQueryLcBaseWrapper(QueryMineStorePO queryMineStorePO,boolean isMustMineralCode,boolean isConMine);

    /**
     * 得到生命周期节点坐标
     * @param lifeCycleMineStore
     * @return
     */
    MineCoordinateVO getLcNodCoor(LifeCycleMineStore lifeCycleMineStore);

    /**
     * 初始化生命周期族谱坐标
     * @param queryMineStoreVOS
     */
    void initLcCoor(List<QueryMineStoreVO> queryMineStoreVOS);

    /**
     * 得到查询登记分类编号列表
     * @param regClassCode 登记分类编号
     * @return 登记分类编号列表
     */
    List<Integer> getQueLcRegClassCodes(Integer regClassCode);

    /**
     * 合并相同日期和证明材料名为一个
     * @param list 生命周期列表
     * @return 合并完的生命周期列表
     */
    List<QueryMineStoreVO> meterSameDateAndReportNameLCNodeList(List<QueryMineStoreVO> list);

    /**
     * 从探矿权复制到无矿权
     * @param queryMineInfoVOS 查询的矿山列表
     * @return 复制完的探矿权
     */
    List<QueryMineInfoVO> fromTKQCopyToWKQ(List<QueryMineInfoVO> queryMineInfoVOS);

    /**
     * 处理年报数据
     * @param queryMineStoreVOS 生命周期数据
     * @return 处理完的数据
     */
    List<QueryMineStoreVO> handYearReport(List<QueryMineStoreVO> queryMineStoreVOS);

}

